package cn.skylark.wcm.controller;

import cn.skylark.wcm.common.util.ReturnMap;
import cn.skylark.wcm.entity.Role;
import cn.skylark.wcm.entity.User;
import cn.skylark.wcm.entity.UserRole;
import cn.skylark.wcm.service.UserRoleService;
import cn.skylark.wcm.service.UserService;
import net.sf.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户权限控制器类
 *
 * @author 武文旭
 * @Date 20180109
 * @since
 */
@RestController
@RequestMapping("/userrole")
public class UserRoleController {
    /**
     * logger
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(TenanController.class);
    @Autowired
    UserRoleService userRoleService;
    @Autowired
    UserService userService;

    /**
     * 增加角色
     * 业务：为用户增加角色，判断角色用户是否已拥有，
     * 拥有替换，不拥有增加
     *
     * @param roleIdsArray String[]
     * @param userid       Integer
     * @return
     * @Exception e 为数据库连接异常
     */
    @RequestMapping(value = "/addRole")
    public String addRole(String[] roleIdsArray, Integer userid) {
        LOGGER.info("用户新增角色开始 roleid=" + roleIdsArray + "userid=" + userid);
        ReturnMap ret = new ReturnMap();
        try {
            if (roleIdsArray == null||"".equals(roleIdsArray)) {
                userRoleService.delete(userid);
            } else {
                for (int i = 0; i < roleIdsArray.length; i++) {
                    Integer count = userRoleService.selectUserRoleByUser(roleIdsArray[i], userid);
                    if (count > 0) {
                        userRoleService.update(roleIdsArray[i], userid);
                    } else {
                        userRoleService.save(roleIdsArray[i], userid);
                    }

                }
            }
            LOGGER.info("用户新增角色结束");
            ret.setFlg(0);
            ret.setMessage("用户新增角色成功！");
            return ret.ReturnMap();
        } catch (Exception e) {
            LOGGER.info("异常信息为=" + e);
            e.printStackTrace();
            ret.setFlg(2);
            ret.setMessage("用户新增角色失败！");
            return ret.ReturnMap();
        }
    }

    /**
     * 根据租户ID获取该租户所有权限
     * 业务：当点击分配角色的时候，通过前台传回来的租户id，通过连接查询，
     * 查询到该租户下的所有角色列表，然后返回一个json的数组格式，如果获取权限成功
     * 返回flg=1和角色的所有信息的json数组列表。
     *
     * @param userid Integer
     * @return Map
     * @Exception e 为数据库连接异常
     */
    @RequestMapping("/getAllRoleByTenanid")
    public String getAllRoleByTenanid(Integer userid) {
        LOGGER.info("获取用户角色列表开始" + "userid:" + userid);
        List<Map<String, Object>> mapList = new ArrayList<>();
        ReturnMap returnMap = new ReturnMap();
        try {
            User user = new User();
            user.setId(userid);
            User userDate = userService.getUserDataById(user);
            UserRole userRole = new UserRole();
            userRole.setDelflg(0);
            Role role = new Role();
            role.setTenanid(userDate.getTenanid());
            //通过租户id获取本租户下的所有的权限进行分配权限
            List<Role> roles = userRoleService.getRoleByTenanId(role);
            for (int i = 0; i < roles.size(); i++) {
                Map<String, Object> map = new HashMap<>();
                map.put("id", roles.get(i).getId());
                map.put("roledesc", roles.get(i).getRoledesc());
                //根据resourceId判断在角色权限表里是否存在该关联，如果存在就标识。
                Integer count = userRoleService.selectUserRoleByID(userDate.getId(),
                        roles.get(i).getId().toString());
                if (count != 0) {
                    map.put("flg", 1);
                } else {
                    map.put("flg", 0);
                }
                mapList.add(map);
            }
            LOGGER.info("获取用户角色列表结束");
            returnMap.setFlg(0);
            returnMap.setMessage("获取角色成功");
            returnMap.setData(JSONArray.fromObject(mapList).toString());
        } catch (Exception e) {
            LOGGER.info("异常类型为" + e);
            e.printStackTrace();
            returnMap.setFlg(2);
            returnMap.setMessage("获取角色失败");
        }
        return returnMap.ReturnMap();
    }

}
